#include "uart0.h"
#include "gpio.h"


void hal_uart0_init(void)
{
	// 1. 设置GPIOD14和GPIOD18引脚为uart功能 
	hal_gpio_init(GPIOD, GPIO_PIN_14, ALT1);
	hal_gpio_init(GPIOD, GPIO_PIN_18, ALT1);
	// 2. 设置串口的通信协议格式:正常模式 8N1
	UART0.ULCON &= (~(0x1 << 6));
	UART0.ULCON &= (~(0x7 << 3));
	UART0.ULCON &= (~(0x1 << 2));
	UART0.ULCON |= (0x3 << 0);
	// 3. 设置串口的波特率  115200bps
	UART0.UBRDIV = 26;
	UART0.UFRACVAL = 2;
	// 4. 设置串口的数据收发模式  轮训模式
	UART0.UCON &= (~(0xF << 0));
	UART0.UCON |= (0x5 << 0);
}

void uart_send_char(char ch)
{
	// 1. 判断发送缓冲区是否为空,
	//    为空发送数据,不为空等待
	while(!(UART0.UTRSTAT & (0x1 << 1)));
	// 2. 将发送数据写到发送数据寄存器
	UART0.UTXH = ch;
	if(ch == '\n')   // 换行
		uart_send_char('\r');  // 回车
	/*
	 * a
	 *  b
	 *   c
	 *    d
	 * */

}
void uart_send_string(char *str)
{
	while(*str != '\0')
		uart_send_char(*str++);
}

char uart_recv_char(void)
{
	char ch;
	// 1. 判断接收缓冲区是否右有效数据
	//    有有效数据则读数据,没有则等待有有效数据
	while(!(UART0.UTRSTAT & (0x1 << 0)));
	// 2. 从接收数据寄存器中读取数据
	ch = UART0.URXH;
	return ch;
}
char buffer[20] = {0};
#define  LEN   (sizeof(buffer)-1)
char *uart_recv_string(void)
{
	int i;
	for (i = 0; i < LEN; i++)
	{
		buffer[i] = uart_recv_char();
		uart_send_char(buffer[i]);
		if (buffer[i] == '\r')
			break;
	}
	buffer[i] = '\0';
	uart_send_char('\n');
	return buffer;
}

